﻿using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Controllers;
using Interfaces;
using Utilities;

namespace Views.Moduler
{
    /// <summary>
    /// Interaction logic for Brugere.xaml
    /// </summary>
    public partial class Brugere : UserControl
    {
        #region Fields

        private readonly Controller _controller;
        private IBruger _selectedBruger;

        #endregion

        #region Creation

        public Brugere(Controller controller)
        {
            InitializeComponent();
            _controller = controller;

            OpdaterSide();
        }

        #endregion

        #region Event Handlers

        // når der er valgt et nyt item i vores listview
        private void ListViewBrugere_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var menu = (ContextMenu)ListViewBrugere.Resources["ItemContextMenu"];
            var items = menu.Items;

            if (ListViewBrugere.SelectedItems.Count == 1)
            {
                var bruger = (IBruger)ListViewBrugere.SelectedItem;
                _selectedBruger = bruger;
                BrugerValgt();
                

                foreach (MenuItem item in items)
                {
                    if (item.Name == "MenuItemRediger")
                    {
                        item.Header = "Rediger";
                    }
                }
            }
            else if (ListViewBrugere.SelectedItems.Count > 1)
            {
                BrugereValgt();

                foreach (MenuItem item in items)
                {
                    if (item.Name == "MenuItemRediger")
                    {
                        item.Header = "Flyt";
                    }
                }
            }
        }

        // der er trykket på flytbruger knappen
        private void BtnFlytBrugere_Click(object sender, RoutedEventArgs e)
        {
            var formular = new Form {BtnSubmit = "Flyt brugere", Title = "Flyt brugere"};

            formular.CreateComboBox<IAfdeling>("afdeling", "Afdeling:", _controller.HentAlleAfdelinger(), "Navn", _controller.HentBrugersAfdeling(_selectedBruger));

            var formWindow = new FormWindow(formular);

            // hvis formularen blev submitted
            if (formWindow.ShowDialog() == true)
            {
                foreach (var bruger in ListViewBrugere.SelectedItems)
                {
                    var tmpBruger = (IBruger)bruger;
                    string navn = tmpBruger.Navn;
                    string initialer = tmpBruger.Initialer;
                    var afdeling = (IAfdeling)formular.Result["afdeling"];

                    if (navn.IsValidStringAndHasMaxLengthOf(25) && 
                        initialer.IsValidStringAndHasMaxLengthOf(5))
                    {
                        bool redigeret = _controller.RedigerBruger(tmpBruger, afdeling, initialer, navn);
                        if (redigeret)
                        {
                            OpdaterBrugereListView();
                        }
                        else
                        {
                            MessageBox.Show(
                                "Er du sikker på at der ikke findes en bruger med de samme initialer?",
                                "Fejl", MessageBoxButton.OK, MessageBoxImage.Error
                                );
                        }
                    }
                }
            }
        }

        // der er trykket på rediger knappen
        private void BtnRediger_Click(object sender, RoutedEventArgs e)
        {
            if (ListViewBrugere.SelectedItems.Count == 1)
            {
                var formular = new Form();
                formular.BtnSubmit = "Opdater bruger";
                formular.Title = "Opdater bruger";

                formular.CreateTextBox("navn", "Navn:", _selectedBruger.Navn, true);
                formular.CreateTextBox("initialer", "Initialer:", _selectedBruger.Initialer);
                formular.CreateComboBox<IAfdeling>("afdeling", "Afdeling:", _controller.HentAlleAfdelinger(), "Navn", _controller.HentBrugersAfdeling(_selectedBruger));

                var formWindow = new FormWindow(formular);

                // hvis formularen blev submitted
                if (formWindow.ShowDialog() == true)
                {
                    string navn = (string) formular.Result["navn"];
                    string initialer = (string) formular.Result["initialer"];
                    var afdeling = (IAfdeling) formular.Result["afdeling"];


                    if (navn.IsValidStringAndHasMaxLengthOf(25) &&
                        initialer.IsValidStringAndHasMaxLengthOf(5))
                    {
                        bool redigeret = _controller.RedigerBruger(_selectedBruger, afdeling, initialer, navn);
                        if (redigeret)
                        {
                            OpdaterBrugereListView();
                        }
                        else
                        {
                            MessageBox.Show(
                                "Er du sikker på at der ikke findes en bruger med de samme initialer?",
                                "Fejl", MessageBoxButton.OK, MessageBoxImage.Error
                                );
                        }
                    }
                    else
                    {
                        string validationError = "";

                        if (!navn.IsValidString())
                            validationError += "Du skal udfylde brugerens navn.\n";
                        else
                            if (!navn.IsValidStringAndHasMaxLengthOf(25))
                                validationError += "Brugerens navn må maks være 25 tegn.\n";             

                        if (!initialer.IsValidString())
                            validationError += "Du skal udfylde brugerens initialer.\n";
                        else
                            if (!initialer.IsValidStringAndHasMaxLengthOf(5))
                                validationError += "Brugerens intialer må maks være 5 tegn.\n";    
                        

                        if (!validationError.IsValidString()) return;

                        MessageBox.Show(validationError);
                    }
                }
            }
        }

        // der er trykket på slet knappen
        private void BtnSlet_Click(object sender, RoutedEventArgs e)
        {
            if (ListViewBrugere.SelectedItems.Count == 1)
            {
                if (MessageBox.Show("Er du sikker på at du vil slette " +
                                    _selectedBruger.Navn + ", " + _selectedBruger.Initialer + "?",
                                    "Vil du slette?", MessageBoxButton.OKCancel, MessageBoxImage.Warning) ==
                    MessageBoxResult.OK)
                {
                    bool fjernet = _controller.FjernBruger(_selectedBruger);
                    if (fjernet)
                    {
                        OpdaterBrugereListView();
                    }
                    else
                    {
                        MessageBox.Show("Der skete en fejl ved sletning af bruger, muligvis en database fejl.");
                    }
                }
            }
            else if (ListViewBrugere.SelectedItems.Count > 1)
            {
                bool annulleret = false;
                bool fjernet = false;
                foreach (var bruger in ListViewBrugere.SelectedItems)
                {
                    var tmpBruger = (IBruger)bruger;
                    if (MessageBox.Show("Er du sikker på at du vil slette " +
                                        tmpBruger.Navn + ", " + tmpBruger.Initialer + "?",
                                        "Vil du slette?", MessageBoxButton.OKCancel, MessageBoxImage.Warning) ==
                        MessageBoxResult.OK)
                    {
                        fjernet = _controller.FjernBruger(tmpBruger);
                    }
                    else
                    {
                        annulleret = true;
                    }
                }
                if (fjernet)
                {
                    OpdaterBrugereListView();
                }
                else if (!annulleret)
                {
                    MessageBox.Show("Der skete en fejl ved sletning af bruger, muligvis en database fejl.");
                }
            }
        }

        // der er trykket på tilføj bruger knappen
        private void BtnOpret_Click(object sender, RoutedEventArgs e)
        {
            var formular = new Form();
            formular.BtnSubmit = "Tilføj ny bruger";
            formular.Title = "Tilføj ny bruger";

            formular.CreateTextBox("navn", "Navn:");
            formular.CreateTextBox("initialer", "Initialer:");
            formular.CreateComboBox<IAfdeling>("afdeling", "Afdeling:", _controller.HentAlleAfdelinger(), "Navn");

            var formWindow = new FormWindow(formular);

            // hvis formularen blev submitted
            if (formWindow.ShowDialog() == true)
            {
                string navn = (string)formular.Result["navn"];
                string initialer = (string)formular.Result["initialer"];
                var afdeling = (IAfdeling)formular.Result["afdeling"];
                if (navn.IsValidStringAndHasMaxLengthOf(25) && 
                    initialer.IsValidStringAndHasMaxLengthOf(5) && 
                    afdeling != null)
                {
                    bool oprettet = _controller.TilføjBruger(afdeling, initialer.ToUpper(), navn);
                    if (oprettet)
                    {
                        OpdaterBrugereListView();
                    }
                    else if (_controller.TjekInitialer(initialer.ToUpper()))
                    {
                        MessageBox.Show(
                            "Der findes allerede en bruger med initialerne " + initialer.ToUpper() + ", prøv igen.",
                            "Fejl", MessageBoxButton.OK, MessageBoxImage.Error);
                        OpretBruger(sender, e, navn, initialer, afdeling);
                    }
                }
                else
                {
                    string validationError = "";

                    if (afdeling == null)
                    {
                        validationError += "Du skal vælge en afdeling til brugeren.\n";
                    }

                    if (!navn.IsValidString())
                    {
                        validationError += "Du skal udfylde brugerens navn.\n";
                    }
                    else
                    {
                        if (!navn.IsValidStringAndHasMaxLengthOf(25))
                        {
                            validationError += "Brugerens navn må maks være 25 tegn.\n";
                        }
                    }

                    if (!initialer.IsValidString())
                    {
                        validationError += "Du skal udfylde brugerens initialer.\n";
                    }
                    else
                    {
                        if (!initialer.IsValidStringAndHasMaxLengthOf(5))
                        {
                            validationError += "Brugerens intialer må maks være 5 tegn.\n";
                        }
                    }

                    if (!validationError.IsValidString()) return;

                    MessageBox.Show(validationError);
                }
            }
        }

        private void OpretBruger(object sender, RoutedEventArgs e, string brugerNavn, string brugerInitialer, IAfdeling brugerAfdeling)
        {
            var formular = new Form();
            formular.BtnSubmit = "Tilføj ny bruger";
            formular.Title = "Tilføj ny bruger";

            formular.CreateTextBox("navn", "Navn:", brugerNavn);
            formular.CreateTextBox("initialer", "Initialer:", brugerInitialer, true);
            formular.CreateComboBox<IAfdeling>("afdeling", "Afdeling:", _controller.HentAlleAfdelinger(), "Navn", brugerAfdeling);

            var formWindow = new FormWindow(formular);

            // hvis formularen blev submitted
            if (formWindow.ShowDialog() == true)
            {
                string navn = (string)formular.Result["navn"];
                string initialer = (string)formular.Result["initialer"];
                var afdeling = (IAfdeling)formular.Result["afdeling"];
                if (navn.IsValidStringAndHasMaxLengthOf(25) && 
                    initialer.IsValidStringAndHasMaxLengthOf(5) && 
                    afdeling != null)
                {
                    bool oprettet = _controller.TilføjBruger(afdeling, initialer.ToUpper(), navn);
                    if (oprettet)
                    {
                        OpdaterBrugereListView();
                    }
                    else if (_controller.TjekInitialer(initialer.ToUpper()))
                    {
                        MessageBox.Show(
                            "Der findes allerede en bruger med initialerne " + initialer.ToUpper() + ", prøv igen.",
                            "Fejl", MessageBoxButton.OK, MessageBoxImage.Error);
                        OpretBruger(sender, e, navn, initialer, afdeling);
                    }
                }
                else
                {
                    string validationError = "";

                    if (afdeling == null)
                    {
                        validationError += "Du skal vælge en afdeling til brugeren.\n";
                    }

                    if (!navn.IsValidString())
                    {
                        validationError += "Du skal udfylde brugerens navn.\n";
                    }
                    else
                    {
                        if (!navn.IsValidStringAndHasMaxLengthOf(25))
                        {
                            validationError += "Brugerens navn må maks være 25 tegn.\n";
                        }
                    }

                    if (!navn.IsValidString())
                    {
                        validationError += "Du skal udfylde brugerens initialer.\n";
                    }
                    else
                    {
                        if (!navn.IsValidStringAndHasMaxLengthOf(5))
                        {
                            validationError += "Brugerens intialer må maks være 5 tegn.\n";
                        }
                    }

                    if (!validationError.IsValidString()) return;

                    MessageBox.Show(validationError);
                }
            }
        }

        // der er dobbeltklikket i ListViewet
        private void ListViewBrugere_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (_selectedBruger == null) return;

            MenuItemVisUdlån_Click(null, new RoutedEventArgs());
        }

        // context menu, kald rediger knappen
        private void MenuItemRediger_Click(object sender, RoutedEventArgs e)
        {
            if (ListViewBrugere.SelectedItems.Count > 1)
            {
                BtnFlytBrugere_Click(null, new RoutedEventArgs());
            }
            else if(ListViewBrugere.SelectedItems.Count == 1)
            {
                BtnRediger_Click(null, new RoutedEventArgs());
            }
        }

        // context menu, kald slet knappen
        private void MenuItemSlet_Click(object sender, RoutedEventArgs e)
        {
            BtnSlet_Click(null, new RoutedEventArgs());
        }

        // context menu, vis udlånsvinduet
        private void MenuItemVisUdlån_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedBruger == null) return;

            var window = new BrugerUdlån(_controller, _selectedBruger);
            window.ShowDialog();
        }

        // context menu, udskriv udlån
        private void MenuItemUdskrivKontrakt_Click(object sender, RoutedEventArgs e)
        {
            _controller.UdskrivKontrakt(_selectedBruger);
        }

        private void BtnBrugerHistorik_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedBruger == null) return;

            var window = new BrugerHistorik(_controller, _selectedBruger);
            window.ShowDialog();
        }

        #endregion

        #region Tilstandsstyring

        // tilstandsstyring til at opdatere siden
        public void OpdaterSide()
        {
            BtnRediger.Visibility = Visibility.Visible;
            BtnFlyt.Visibility = Visibility.Collapsed;
            ListViewBrugere.SelectedItem = null;
            BtnVisUdlån.IsEnabled = false;
            BtnUdskrivKontrakt.IsEnabled = false;
            BtnBrugerHistorik.IsEnabled = false;
            BtnRediger.IsEnabled = false;
            BtnSlet.IsEnabled = false;
            OpdaterBrugereListView();
        }

        // metode til at opdatere indholdet i listviewet
        private void OpdaterBrugereListView()
        {
            ListViewBrugere.ItemsSource = _controller.HentAlleBrugere();
        }

        // tilstandsstyring til hvis der kun er valgt en bruger i listviewet
        private void BrugerValgt()
        {
            BtnRediger.Visibility = Visibility.Visible;
            BtnFlyt.Visibility = Visibility.Collapsed;
            BtnVisUdlån.IsEnabled = true;
            BtnUdskrivKontrakt.IsEnabled = true;
            BtnBrugerHistorik.IsEnabled = true;
            BtnRediger.IsEnabled = true;
            BtnSlet.IsEnabled = true;
        }

        // tilstandsstyring til hvis der er valgt ¨flere brugere i listviewet
        private void BrugereValgt()
        {
            BtnRediger.Visibility = Visibility.Collapsed;
            BtnFlyt.Visibility = Visibility.Visible;
            BtnVisUdlån.IsEnabled = false;
            BtnUdskrivKontrakt.IsEnabled = false;
            BtnRediger.IsEnabled = false;
            BtnSlet.IsEnabled = true;
            BtnFlyt.IsEnabled = true;
        }

        #endregion
    }
}
